package com.winner.data.util;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.Objects;
import java.util.Optional;

import cn.hutool.core.collection.CollUtil;
import com.winner.data.entity.User;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;

/**
 * 找list时间最大或数字最大的(注意时间/数字不能为空)
 *
 * @author wangxinle5
 * @since 2023-12-04
 */
public class ListMaxUtil {

    public static void main(String[] args) {
        ArrayList<User> list = new ArrayList<>();

        User user1 = new User();
        user1.setName("zhangsan");
        user1.setBirthdate(DateUtil.yesterday());

        User user2 = new User();
        user2.setName("lisi");
        user2.setBirthdate(DateUtil.tomorrow());

        // 包含为null的日期, max函数会有空指针 User user = list.stream().max(Comparator.comparing(User::getBirthdate)).orElse(null);
        User user3 = new User();
        user3.setName("wangwu");
        user3.setBirthdate(null);
        list.add(user1);
        list.add(user2);
        list.add(user3);

        // 求最大的返回属性, 如果有为空的也是会有空指针的问题, 需要过滤出不为空的, 再找最大的
        Date date = list.stream().map(User::getBirthdate).filter(Objects::nonNull).max(Date::compareTo).orElse(null);
        System.out.println(date);

        // 注意getBirthdate不能为空, 否则空指针报错,  使用Comparator.nullsFirst()确保null值在比较时排在前面, 避免空指针, 最大值的时候取的是后面的
        User user = list.stream().max(Comparator.comparing(User::getBirthdate,Comparator.nullsFirst(Comparator.naturalOrder()))).orElse(null);
        String name = Optional.ofNullable(user).map(User::getName).orElse(null);
        System.out.println(name);

        User first = CollUtil.getFirst(list);
        System.out.println(StrUtil.format("第一个元素是 {}", first));
        User last = CollUtil.getLast(list);
        System.out.println(StrUtil.format("最后一个元素是 {}", last));

        // 使用lambda表达式取第一个元素  findFirst().map可以避免空指针
        String firstElementName =
            list.stream().filter(a -> StrUtil.isNotBlank(a.getName())).findFirst().map(User::getName).orElse(null);
        System.out.println(firstElementName);

    }
}
